package org.lai.aop;

import lombok.extern.slf4j.Slf4j;
import org.lai.Utils.CurrentHolder;
import org.lai.anno.Log;
import org.lai.mapper.OperateLogMapper;
import org.lai.pojo.OperateLog;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Arrays;
@Slf4j
@Aspect
@Component
public class OperationLogAspect {

    @Autowired
    private OperateLogMapper operateLogMapper;

    // 环绕通知
    @Around("@annotation(org.lai.anno.Log)")
//    @Around("@annotation(log)") // 修改了这里
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        // 记录开始时间
        long startTime = System.currentTimeMillis();
        // 执行方法
        Object result = joinPoint.proceed();
        // 当前时间
        long endTime = System.currentTimeMillis();
        // 耗时
        long costTime = endTime - startTime;

        // 构建日志对象
        OperateLog operateLog = new OperateLog();
        Integer id = getCurrentUserId();
        operateLog.setOperateEmpId(id);
        // 方案一:使用id执行sql获取emp的name 但是需要在mysql中添加一个员工字段name
        operateLog.setOperateEmpName(operateLogMapper.getEmpName(id));
        // 方案二: 创建一个员工表ThreadLocal泛型为员工表,然后使用get方法单个获取数据 // 高效但麻烦
//        operateLog.setOperateEmpName(getCurrentUserId()+"");
        operateLog.setOperateTime(LocalDateTime.now()); // 获取系统当前时间
        operateLog.setClassName(joinPoint.getTarget().getClass().getName()); // 获取目标类的全限定名
        operateLog.setMethodName(joinPoint.getSignature().getName()); // 获取目标方法名
        operateLog.setMethodParams(Arrays.toString(joinPoint.getArgs())); // 获取目标方法的参数
        operateLog.setReturnValue(result.toString()); // 获取目标方法的返回值
        operateLog.setCostTime(costTime); // 获取目标方法的耗时
        log.info("操作日志：{}", operateLog);
        // 插入日志
        operateLogMapper.insert(operateLog); // 调用Mapper的insert方法插入日志
        return result;
    }
    
    // 示例方法，获取当前用户ID
    private int getCurrentUserId() {
        return CurrentHolder.getCurrentId();
    }
}